import { mount } from 'vue-test-utils'
import exportBtn from 'src/views/button/src/exportBtn.vue'

describe('exportBtn', () => {
  it('exportBtn 基本属性用例: { action, queryBody, type }', () => {
    // 使用mount可以创建一个包涵被挂载和渲染的一个实例
    const vm = mount(exportBtn, {
      propsData: {
        action: 'api',
        queryBody: {
          name: 'export'
        },
        type: 'text'
      }
    })
    expect(vm.props().action).to.be.equal('api')
    expect(vm.props().queryBody.name).to.be.equal('export')
    expect(vm.props().type).to.be.equal('text')
    expect(vm.html().includes('type="text"')).to.be.equal(true)
    expect(vm.text()).to.be.equal('导出') // 默认文本
  })

  it('exportBtn 插槽用例: { default }', () => {
    // 使用mount可以创建一个包涵被挂载和渲染的一个实例
    const vm = mount(exportBtn, {
      propsData: {
        action: 'api',
        queryBody: {
          name: 'export'
        },
        type: 'text'
      },
      slots: {
        default: '<span>插槽按钮</span>'
      }
    })
    expect(vm.html().includes('<span>插槽按钮</span>')).to.be.equal(true)
    expect(vm.text()).to.be.equal('插槽按钮') // 默认文本
  })

  it('exportBtn 导出成功用例', async () => {
    // 使用mount可以创建一个包涵被挂载和渲染的一个实例
    const vm = mount(exportBtn, {
      propsData: {
        action: 'api',
        queryBody: {}
      },
      mocks: {
        $api: {
          api: (e) => {
            return new Promise((resolve, reject) => {
              expect(vm.vm.loading).to.be.equal(true) // 加载 loading
              resolve(e)
            })
          }
        },
        $message: {
          success: () => true
        }
      }
    })
    await vm.trigger('click')
    await vm.vm.$nextTick()
    expect('onSuccess' in vm.emitted()).to.be.equal(true)  // 导出成功事件触发
    expect('onFail' in vm.emitted()).to.be.equal(false)    // 导出失败事件不触发
    expect(vm.vm.loading).to.be.equal(false)
  })

  it('exportBtn 导出失败用例', async () => {
    // 使用mount可以创建一个包涵被挂载和渲染的一个实例
    const vm = mount(exportBtn, {
      propsData: {
        action: 'api',
        queryBody: {}
      },
      mocks: {
        $api: {
          api: (e) => {
            return new Promise((resolve, reject) => {
              expect(vm.vm.loading).to.be.equal(true) // 加载 loading
              reject(e)
            })
          }
        },
        $message: {
          success: () => true
        }
      }
    })
    await vm.trigger('click')
    await vm.vm.$nextTick()
    expect('onFail' in vm.emitted()).to.be.equal(true)        // 导出失败事件不触发
    expect('onSuccess' in vm.emitted()).to.be.equal(false)    // 导出成功事件触发
    expect(vm.vm.loading).to.be.equal(false)
  })
})
